/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package nexus.criterios;

import java.util.ArrayList;
import javax.faces.context.FacesContext;
import javax.faces.el.VariableResolver;
import nexus.criterios.CriterioEvaluacion;
import nexus.criterios.GestorCriteriosDB;
import org.apache.myfaces.custom.tree2.HtmlTree;
import org.apache.myfaces.custom.tree2.TreeModel;
import org.apache.myfaces.custom.tree2.TreeModelBase;
import org.apache.myfaces.custom.tree2.TreeNode;
import org.apache.myfaces.custom.tree2.TreeNodeBase;



import control.UserBean;
import java.util.List;
import javax.swing.JOptionPane;
import nexus.adec.Espacio;
import nexus.adec.GestorEspacioDB;
/**
 *
 * @author juampi
 */
public class CriterioTree {
    private TreeModelBase     _treeModel;
    private HtmlTree          _tree;
    private String NODO_EVALUACION="nodoEvaluacion";
    private String NODO_EVALUACION_HOJA="nodoEvaluacionHoja";
    private String NODO_RAIZ="nodoRaiz";
    private boolean mostrarOpcionesHoja;
    private boolean mostrarOpcionesIntermedio;
    TreeNode treeData;
    private String String;

    public CriterioTree() {
        
    }

    /**
     * @return the _treeModel
     */
    public TreeModelBase getTreeModel() {
        return _treeModel;
    }

    /**
     * @param treeModel the _treeModel to set
     */
    public void setTreeModel(TreeModelBase treeModel) {
        this._treeModel = treeModel;
    }

    /**
     * @return the _tree
     */
    public HtmlTree getTree() {
        return _tree;
    }

    /**
     * @param tree the _tree to set
     */
    public void setTree(HtmlTree tree) {
        this._tree = tree;
    }

    public TreeModel getExpandedTreeData()
    {
        return new TreeModelBase(getTreeData());
    }
    public TreeNode getTreeData()
    {
        String respuesta = GestorCriteriosDB.getInstance().verificarAsignacionCriterio(getUser().getCodigoCurso());
        CriterioEvaluacion criterio;
        if(respuesta.equals(GestorCriteriosDB.NO_EXISTE)) {
            criterio = GestorCriteriosDB.getInstance().crearCriterioEvaluacion(getUser().getCodigoCurso());
        } else {
            criterio = GestorCriteriosDB.getInstance().recuperarCriterioEvaluacion(respuesta);
        }
        //treeData
        Espacio espNombre =  GestorEspacioDB.getInstance().obtenerCurso(getUser().getCodigoCurso(),getUser().getId());
        NodoEvaluacion nodoEva = new NodoEvaluacion(NODO_RAIZ, espNombre.getNombreEspacio(),criterio.getCodigoCriterio(), false);
        nodoEva.setCriterio(criterio.getCriterioCalificacion());
        treeData = nodoEva;
        if(criterio!=null) {
            if(criterio.tieneSubcriterios()) {
                crearArbol(criterio,treeData,criterio.getNombreCriterio());
            }
        }else {
            JOptionPane.showMessageDialog(null,"critero te devuelve  null");
        }
        
        return treeData;
    }
    private void crearArbol(CriterioEvaluacion criterio, TreeNode nodoPadre,String nombrePadre) {
        ArrayList<CriterioEvaluacion> criteriosHijos = criterio.getSubcriterios();
        for (CriterioEvaluacion criterioHijo : criteriosHijos) {
            TreeNodeBase nodo;
            if(criterioHijo.tieneSubcriterios()) {
                //JOptionPane.showConfirmDialog(null,nombrePadre+ " tiene sub criterios "+criterioHijo.getCriterioCalificacion()+"---"+criterioHijo.getNombreCriterio());
                NodoEvaluacion nodoEva = new NodoEvaluacion(NODO_EVALUACION, criterioHijo.getNombreCriterio(), criterioHijo.getCodigoCriterio(), false);
                nodoEva.setCriterio(criterio.getCriterioCalificacion());
                nodo = nodoEva;
                crearArbol(criterioHijo, nodo,criterioHijo.getNombreCriterio());
            } else {
                //JOptionPane.showConfirmDialog(null, nombrePadre+" no tiene sub criterios "+criterioHijo.getCriterioCalificacion()+"--"+criterioHijo.getNombreCriterio());
                NodoEvaluacion nodoEva = new NodoEvaluacion(NODO_EVALUACION, criterioHijo.getNombreCriterio(), criterioHijo.getCodigoCriterio(), true);
                nodoEva.setCriterio(criterio.getCriterioCalificacion());
                nodo =  nodoEva;
            }
            nodoPadre.getChildren().add(nodo);
        }
    }
    public UserBean getUser() {
        FacesContext context = FacesContext.getCurrentInstance();
        VariableResolver vr = context.getApplication().getVariableResolver();
        UserBean user = (UserBean)vr.resolveVariable(context, "userBean");
        return user;
    }

    /**
     * @return the mostrarOpcionesHoja
     */
    public boolean isMostrarOpcionesHoja() {
        return mostrarOpcionesHoja;
    }

    /**
     * @param mostrarOpcionesHoja the mostrarOpcionesHoja to set
     */
    public void setMostrarOpcionesHoja(boolean mostrarOpcionesHoja) {
        this.mostrarOpcionesHoja = mostrarOpcionesHoja;
    }

    /**
     * @return the mostrarOpcionesIntermedio
     */
    public boolean isMostrarOpcionesIntermedio() {
        return mostrarOpcionesIntermedio;
    }

    /**
     * @param mostrarOpcionesIntermedio the mostrarOpcionesIntermedio to set
     */
    public void setMostrarOpcionesIntermedio(boolean mostrarOpcionesIntermedio) {
        this.mostrarOpcionesIntermedio = mostrarOpcionesIntermedio;
    }
    public boolean verificarExisteCriterioEvaluacion(String nombre) {
        boolean res  = false;
        ArrayList<TreeNodeBase> listaTotal = new ArrayList<TreeNodeBase>();
        listaTotal.add((TreeNodeBase)treeData);
        while (listaTotal.size()>0) {
            TreeNodeBase nodoActual = listaTotal.remove(0);
            if(!nodoActual.getDescription().equalsIgnoreCase(nombre)) {
                List listaHijos = nodoActual.getChildren();
                for (Object object : listaHijos) {
                    if(object instanceof TreeNodeBase) {
                        listaTotal.add((TreeNodeBase)object);
                    }
                }
            } else {
                return true;
            }
        }
        return false;
    }
}
